home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / rex.lha / rex / m2c / Classes.c next >
C/C++ Source or Header  |  1992-08-18  |  7KB  |  278 lines

  1. #include "SYSTEM_.h"
  2.  
  3. #ifndef DEFINITION_DynArray
  4. #include "DynArray.h"
  5. #endif
  6.  
  7. #ifndef DEFINITION_Strings
  8. #include "Strings.h"
  9. #endif
  10.  
  11. #ifndef DEFINITION_StringMem
  12. #include "StringMem.h"
  13. #endif
  14.  
  15. #ifndef DEFINITION_IO
  16. #include "IO.h"
  17. #endif
  18.  
  19. #ifndef DEFINITION_Layout
  20. #include "Layout.h"
  21. #endif
  22.  
  23. #ifndef DEFINITION_Sets
  24. #include "Sets.h"
  25. #endif
  26.  
  27. #ifndef DEFINITION_Tree0
  28. #include "Tree0.h"
  29. #endif
  30.  
  31. #ifndef DEFINITION_Dfa
  32. #include "Dfa.h"
  33. #endif
  34.  
  35. #ifndef DEFINITION_Classes
  36. #include "Classes.h"
  37. #endif
  38.  
  39. Sets_tSet Classes_CharSet, Classes_Unused;
  40. struct Classes_2 Classes_ToClass, Classes_ToChar;
  41. struct Classes_3 *Classes_SetMemPtr;
  42. LONGINT Classes_SetMemSize;
  43. INTEGER Classes_SetCount;
  44. struct Classes_4 *Classes_ClassMemPtr;
  45. LONGINT Classes_ClassMemSize;
  46. CHAR Classes_ClassCount;
  47.  
  48. static void CollectSets ARGS((Tree0_tTree0 t));
  49. static CHAR Class;
  50. static void CharToClass0 ARGS((CARDINAL Ch));
  51. static void CharToClass ARGS((CARDINAL Ch));
  52.  
  53.  
  54. INTEGER Classes_IsInSetMem
  55. # ifdef __STDC__
  56. (Sets_tSet Set)
  57. # else
  58. (Set)
  59. Sets_tSet Set;
  60. # endif
  61. {
  62.   INTEGER i;
  63.  
  64.   {
  65.     LONGINT B_1 = 1, B_2 = Classes_SetCount;
  66.  
  67.     if (B_1 <= B_2)
  68.       for (i = B_1;; i += 1) {
  69.         if (Sets_IsEqual(&Set, &Classes_SetMemPtr->A[i].Set)) {
  70.           return i;
  71.         }
  72.         if (i >= B_2) break;
  73.       }
  74.   }
  75.   return 0;
  76. }
  77.  
  78. static void CollectSets
  79. # ifdef __STDC__
  80. (Tree0_tTree0 t)
  81. # else
  82. (t)
  83. Tree0_tTree0 t;
  84. # endif
  85. {
  86.   CARDINAL i;
  87.   Strings_tString string;
  88.  
  89.   switch (t->U_1.V_1.Kind) {
  90.   case Tree0_Ch:;
  91.     Sets_Include(&Classes_CharSet, ORD(t->U_1.V_11.Ch.Ch));
  92.     break;
  93.   case Tree0_Set:;
  94.     if (Classes_IsInSetMem(t->U_1.V_12.Set.Set) == 0) {
  95.       INC(Classes_SetCount);
  96.       if (Classes_SetCount == Classes_SetMemSize) {
  97.         DynArray_ExtendArray((ADDRESS *)&Classes_SetMemPtr, &Classes_SetMemSize, (LONGINT)sizeof(Classes_ClassInfo));
  98.       }
  99.       Sets_MakeSet(&Classes_SetMemPtr->A[Classes_SetCount].Set, ORD(Dfa_LastCh));
  100.       Sets_Assign(&Classes_SetMemPtr->A[Classes_SetCount].Set, t->U_1.V_12.Set.Set);
  101.       Sets_Union(&Classes_Unused, t->U_1.V_12.Set.Set);
  102.     }
  103.     break;
  104.   case Tree0_String:;
  105.     StringMem_GetString(t->U_1.V_13.String.String, &string);
  106.     for (i = Strings_Length(&string); i >= 1; i += -1) {
  107.       Sets_Include(&Classes_CharSet, ORD(Strings_Char(&string, (Strings_tStringIndex)i)));
  108.     }
  109.     break;
  110.   default :
  111.     break;
  112.   }
  113. }
  114.  
  115. static void CharToClass0
  116. # ifdef __STDC__
  117. (CARDINAL Ch)
  118. # else
  119. (Ch)
  120. CARDINAL Ch;
  121. # endif
  122. {
  123.   Classes_ToClass.A[CHR(Ch)] = Class;
  124. }
  125.  
  126. static void CharToClass
  127. # ifdef __STDC__
  128. (CARDINAL Ch)
  129. # else
  130. (Ch)
  131. CARDINAL Ch;
  132. # endif
  133. {
  134.   INC(Dfa_LastCh);
  135.   Classes_ToClass.A[CHR(Ch)] = Dfa_LastCh;
  136.   Classes_ToChar.A[Dfa_LastCh] = CHR(Ch);
  137. }
  138.  
  139. void Classes_ComputeClasses
  140. # ifdef __STDC__
  141. (BOOLEAN Blocking)
  142. # else
  143. (Blocking)
  144. BOOLEAN Blocking;
  145. # endif
  146. {
  147.   INTEGER i;
  148.   CHAR j;
  149.   Sets_tSet Set;
  150.  
  151.   Dfa_OldLastCh = Dfa_LastCh;
  152.   Sets_MakeSet(&Classes_CharSet, ORD(Dfa_LastCh));
  153.   Sets_MakeSet(&Classes_Unused, ORD(Dfa_LastCh));
  154.   if (Blocking) {
  155.     Tree0_TraverseTree0TD(Tree0_Tree0Root, (Tree0_tProcTree)CollectSets);
  156.     Sets_Include(&Classes_CharSet, ORD(Dfa_EobCh));
  157.     Sets_Union(&Classes_Unused, Classes_CharSet);
  158.     Sets_Complement(&Classes_Unused);
  159.   } else {
  160.     Sets_Include(&Classes_CharSet, ORD(Dfa_FirstCh));
  161.     Sets_Complement(&Classes_CharSet);
  162.   }
  163.   Classes_ClassCount = '\0';
  164.   Sets_MakeSet(&Classes_ClassMemPtr->A['\0'], ORD(Dfa_LastCh));
  165.   Sets_Assign(&Classes_ClassMemPtr->A['\0'], Classes_CharSet);
  166.   Sets_Union(&Classes_ClassMemPtr->A['\0'], Classes_Unused);
  167.   Sets_Complement(&Classes_ClassMemPtr->A['\0']);
  168.   Sets_MakeSet(&Set, ORD(Dfa_LastCh));
  169.   {
  170.     LONGINT B_3 = 1, B_4 = Classes_SetCount;
  171.  
  172.     if (B_3 <= B_4)
  173.       for (i = B_3;; i += 1) {
  174.         {
  175.           CHAR B_5 = '\0', B_6 = Classes_ClassCount;
  176.  
  177.           if (B_5 <= B_6)
  178.             for (j = B_5;; j += 1) {
  179.               Sets_Assign(&Set, Classes_SetMemPtr->A[i].Set);
  180.               Sets_Difference(&Set, Classes_CharSet);
  181.               Sets_Intersection(&Set, Classes_ClassMemPtr->A[j]);
  182.               if (!Sets_IsEmpty(Set) && !Sets_IsEqual(&Set, &Classes_ClassMemPtr->A[j])) {
  183.                 INC(Classes_ClassCount);
  184.                 if (ORD(Classes_ClassCount) == (CARDINAL)Classes_ClassMemSize) {
  185.                   DynArray_ExtendArray((ADDRESS *)&Classes_ClassMemPtr, &Classes_ClassMemSize, (LONGINT)sizeof(Sets_tSet));
  186.                 }
  187.                 Sets_MakeSet(&Classes_ClassMemPtr->A[Classes_ClassCount], ORD(Dfa_LastCh));
  188.                 Sets_Assign(&Classes_ClassMemPtr->A[Classes_ClassCount], Set);
  189.                 Sets_Difference(&Classes_ClassMemPtr->A[j], Set);
  190.               }
  191.               if (j >= B_6) break;
  192.             }
  193.         }
  194.         if (i >= B_4) break;
  195.       }
  196.   }
  197.   Sets_ReleaseSet(&Set);
  198.   {
  199.     LONGINT B_7 = 1, B_8 = Classes_SetCount;
  200.  
  201.     if (B_7 <= B_8)
  202.       for (i = B_7;; i += 1) {
  203.         Sets_MakeSet(&Classes_SetMemPtr->A[i].Classes, ORD(Classes_ClassCount));
  204.         {
  205.           CHAR B_9 = '\0', B_10 = Classes_ClassCount;
  206.  
  207.           if (B_9 <= B_10)
  208.             for (j = B_9;; j += 1) {
  209.               if (Sets_IsSubset(Classes_ClassMemPtr->A[j], Classes_SetMemPtr->A[i].Set)) {
  210.                 Sets_Include(&Classes_SetMemPtr->A[i].Classes, ORD(j));
  211.               }
  212.               if (j >= B_10) break;
  213.             }
  214.         }
  215.         if (i >= B_8) break;
  216.       }
  217.   }
  218.   {
  219.     CHAR B_11 = '\0', B_12 = Classes_ClassCount;
  220.  
  221.     if (B_11 <= B_12)
  222.       for (j = B_11;; j += 1) {
  223.         Class = j;
  224.         Sets_ForallDo(Classes_ClassMemPtr->A[j], (Sets_ProcOfCard)CharToClass0);
  225.         if (j >= B_12) break;
  226.       }
  227.   }
  228.   Dfa_LastCh = Classes_ClassCount;
  229.   Sets_ForallDo(Classes_CharSet, (Sets_ProcOfCard)CharToClass);
  230. }
  231.  
  232. void Classes_ReleaseSetMem
  233. # ifdef __STDC__
  234. ()
  235. # else
  236. ()
  237. # endif
  238. {
  239.   INTEGER i;
  240.  
  241.   {
  242.     LONGINT B_13 = 1, B_14 = Classes_SetCount;
  243.  
  244.     if (B_13 <= B_14)
  245.       for (i = B_13;; i += 1) {
  246.         Sets_ReleaseSet(&Classes_SetMemPtr->A[i].Set);
  247.         Sets_ReleaseSet(&Classes_SetMemPtr->A[i].Classes);
  248.         if (i >= B_14) break;
  249.       }
  250.   }
  251.   DynArray_ReleaseArray((ADDRESS *)&Classes_SetMemPtr, &Classes_SetMemSize, (LONGINT)sizeof(Classes_ClassInfo));
  252. }
  253.  
  254. void BEGIN_Classes()
  255. {
  256.   static BOOLEAN has_been_called = FALSE;
  257.  
  258.   if (!has_been_called) {
  259.     has_been_called = TRUE;
  260.  
  261.     BEGIN_Sets();
  262.     BEGIN_DynArray();
  263.     BEGIN_Strings();
  264.     BEGIN_StringMem();
  265.     BEGIN_IO();
  266.     BEGIN_Layout();
  267.     BEGIN_Sets();
  268.     BEGIN_Tree0();
  269.     BEGIN_Dfa();
  270.  
  271.     Classes_SetMemSize = 16;
  272.     DynArray_MakeArray((ADDRESS *)&Classes_SetMemPtr, &Classes_SetMemSize, (LONGINT)sizeof(Classes_ClassInfo));
  273.     Classes_SetCount = 0;
  274.     Classes_ClassMemSize = 16;
  275.     DynArray_MakeArray((ADDRESS *)&Classes_ClassMemPtr, &Classes_ClassMemSize, (LONGINT)sizeof(Sets_tSet));
  276.   }
  277. }
  278.